0. 前言
看完《深入理解Java虚拟机2》后,接着看《Spring Boot2精髓》(理论向的和技术向的书交替看),之前浅涉过Spring Boot1.x,这次打算认识下Spring Boot2.x与Spring Boot1.x的区别,毕竟是当下最火的框架之一,未必会使用,但其中的思想以及对框架的整合技巧也对自己有不少好处,同时复习下Spring系列的框架。
其中谈及了Beetlsql这个国人开发的面向sql为中心的数据库框架,据说其综合性能与Mybatis、Hibernate比肩甚至在其之上,开发效率也十分之高,还非常有趣的使用md文件保存sql语句。所以我打算学习BeetlSQL,来应用到以后的项目上。就在我跟着书看完后,打算动手实操之时,即使是跟着书上的来做,该说是果然也确实是果然,一系列的问题涌现出来,所以决定记录下这次的实践。
1. Beetlsql简介
BeetlSQL是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心(Hibernate以对象为中心),同时又需求工具能自动能生成大量常用的SQL的应用。
特点:
- 开发效率
- 无需注解,自动使用大量内置SQL,轻易完成增删改查功能,节省50%的开发工作量。
- 数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型。
- SQL 模板基于Beetl实现,更容易写和调试,以及扩展。
- 可以针对单个表(或者视图)代码生成pojo类和sql模版,甚至是整个数据库。能减少代码编写工作量。
- 维护性
- SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试。
- 可以自动将sql文件映射为dao接口类。
- 灵活直观的支持支持一对一,一对多,多对多关系映射而不引入复杂的OR Mapping概念和技术。
- 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能。
- 其他
- 内置支持主从数据库支持的开源工具
- 性能数倍于JPA,MyBatis
- 支持跨数据库平台,开发者所需工作减少到最小,目前跨数据库支持mysql,postgres,oracle,sqlserver,h2,sqllite,DB2.
性能与Mybatis、Hibernate相比如下图:
以上介绍皆来源于官方网站,详细可浏览:
2. 技术准备
- 操作平台:Windows 7, 64bit 8G
- IDE:MyEclipse 2016
- JDK版本:1.8.0_121
- 涉及技术
- Spring Boot 2.x
- BeetlSQL 2.x
- Maven 3.x
3. 整合过程
3.1 项目结构
大部分直接采用书上所介绍的例子,也加入了自己定义的类,其中的JacksonConf.java
和GlobalExceptionHandler.java
可以忽略
3.2 pom.xml
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
第一个问题:不知道是网络的问题,还是阿里云仓库的问题,亦或者是jar包本身的问题,
beetl-framework-starter
的下载速度奇慢无比,等个五分钟终于看见MyEclipse右下角的进度条消失了。然而,当我再次修改pom.xml时,IDE报出一堆的错误,第一个错误是Description Resource Path Location Type Failed to read artifact descriptor for com.ibeetl:beetl-framework-starter:jar:1.1.40.RELEASE
,其余的都是Missing artifact **
加上各种包名,显然原因在第一个错误。起初以为是jar没有成功下载下来,翻下本地Maven仓库,beetl-framework-starter
的jar包确实存在,应该也不是Maven本身的问题,尝试着Update一下项目,结果还是那样,怎么回事?而且每次保存pom.xml文件的时候,后台进程的速度都非常的慢,而注释掉beetl-framework-starter
的引用后,情况就变好了,猜测是beetl-framework-starter
本身或阿里云仓库的问题,最终后退一步,使用原始的方式手动build path到beetl-framework-starter
。第二个问题:书上及给出的代码并没有添加
beetlsql
的依赖,实际上是要补上的,即:1
2
3
4
5<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetlsql</artifactId>
<version>2.10.10</version>
</dependency>第三个问题:这个是最初遇到的问题,浏览相关文章后发现这是个比较普遍的问题:添加SpringBoot 2.x版本依赖的时候,pom.xml文件第一行会报错:
org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apach
,原因就是maven的配置文件不是最新的,需要升级一下,有两种解决方法:- 在IDE中,help ->Install New Software -> add ->
https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST
,下载最新的插件。 - 添加如下依赖,手动配置降低maven插件版本(2.6以下):
1
2
3
4
5<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version><!--$NO-MVN-MAN-VER$ -->
</plugin>
- 在IDE中,help ->Install New Software -> add ->
3.3 配置类 DataSourceConfig
只需要配置一个Bean即可,非常方便。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.bee.sample.ch5.conf;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
public class DataSourceConfig {
@Bean(name = "dataSource")
public DataSource datasource(Environment env) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
return ds;
}
}
网上的文章有不同的配置方式,但代码比较多而且跑起来还出错,这里只要正确的布置就不会有问题。
3.4 配置文件 application.yml
yml的配置方式比属性文件的配置方式看起来更简洁。
application.yml1
2
3
4
5
6spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/beetlsql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
username: root
password: yourpassword
driver-class-name: com.mysql.jdbc.Driver
第四个问题:运行Spring Boot的main函数时,报出了无法获取JDBC连接的异常,起初以为是没有正确的加载到配置文件或者是配置参数写错了,也发现在配置类中
spring.datasource.url
等值为null,但后来发现是缺少了spring-boot-starter-jdbc
的依赖,如2.2的pom.xml中添加jdbc的依赖即可。第五个问题:同样是数据库连接的问题,原因在于
driver-class-name
与pom.xml的依赖不一致,如果是像书中所写使用driver-class-name: com.mysql.cj.jdbc.Driver
,那么pom.xml中一定要显示标明mysql连接器的版本号(6.x),即:1
2
3
4
5<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>否则默认使用5.x的版本,与配置不一致。如果使用
driver-class-name: com.mysql.jdbc.Driver
,则可以不标明版本。
3.5 实体类 User
1 | package com.bee.sample.ch5.entity; |
3.6 数据获取层 UserDao
先准备好一些数据以供测试(直接使用书上提供的)
db.sql:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',
`department_id` int(11) DEFAULT NULL,
`create_time` date DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `user` VALUES (1, 'helo', 1, '2017-4-21 11:52:41');
INSERT INTO `department` VALUES ('1', '研发部门');
Dao接口直接继承BaseMapper<T>
类,可以使用内置的单表增删查改功能,免去了大量代码的编写,具体的使用可参考文档。这里的selectSample
接口是为了测试Mapper文件中的sql语句能否正常关联并调用。
默认情况下,Spring Boot会去寻找resources/sql/下的md文件作为Mapper文件与com包下面的以Dao结尾的类进行关联,Mapper文件名约定为类名,首字母小写,可通过配置文件修改默认配置。也因为自动扫描Dao的缘故,不需要@Repository
UserDao:1
2
3
4
5
6
7
8
9
10package com.bee.sample.ch5.dao;
import java.util.List;
import org.beetl.sql.core.annotatoin.Param;
import org.beetl.sql.core.mapper.BaseMapper;
import com.bee.sample.ch5.entity.User;
public interface UserDao extends BaseMapper<User>{
List<User> selectSample(@Param("name") String name);
}
- 第六个问题:关于接口与Mapper文件的映射,采用上述的默认方式可以省去一些工作,但在设置接口参数的时候曾无法获取参数,后经验证,加上
@Param
可保证参数正常传递。
关于映射文件的一些简单说明:
- 采用md格式,“===”的上面是SQL语句的唯一标识,也是接口的名称,下面是SQL语句;
- “===”下面采用“*”作为多行注释;
- “@”和回车符作为定界符号,里面可写Beetl语句(类似JSTL)。
user.md1
2
3
4
5
6
7
8
9selectSample
===
* 一个简单的查询例子
select * from user where 1=1
@if(!isEmpty(name)) {
and name = #name#
@}
3.7 业务层 UserService
获取数据利用了BeetlSQL提供的SQLManager类而忽略了Dao层,可在Dao层继承BaseMapper类完成,这里不影响。
UserService1
2
3
4
5
6
7
8
9package com.bee.sample.ch5.service;
import java.util.List;
import com.bee.sample.ch5.entity.User;
public interface UserService {
User getUserById(Integer id);
List<User> listByName(String name);
}
UserSericeImpl1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package com.bee.sample.ch5.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bee.sample.ch5.dao.UserDao;
import com.bee.sample.ch5.entity.User;
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserDao userDao;
@Override
public User getUserById(Integer id) {
User user = userDao.single(id);
return user;
}
@Override
public List<User> listByName(String name) {
List<User> list = userDao.selectSample(name);
return list;
}
}
3.8 控制层 UserController
返回的自定JSON对象ResponseJson
就不列出来了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32package com.bee.sample.ch5.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bee.sample.ch3.dto.ResponseJson;
import com.bee.sample.ch5.entity.User;
import com.bee.sample.ch5.service.UserService;
@Controller
public class UserController {
@Autowired
UserService userService;
@GetMapping("/user/{id}")
@ResponseBody
public ResponseJson getUser(@PathVariable("id") Integer id) {
User user = userService.getUserById(id);
return new ResponseJson().setData("user", user);
}
@GetMapping("/user")
@ResponseBody
public ResponseJson selectUser(String name) {
List<User> list = userService.listByName(name);
return new ResponseJson().setData("user", list);
}
}
4. 结果演示
getByUserId()
接口的Postman测试结果:
对应的IDE控制台输出:
listByName()
接口的Postman测试结果:
对应的IDE控制台输出:
IDE控制台输出是BeetlSQL的debug模式下的结果,默认开启。
5. 小节
主要是记录Spring Boot2.x整合BeetlSQL2.x正确的配置方式与所遇到的问题,有问题欢迎指出。
Copyright © 2018, GDUT CSCW back-end Kanarien, All Rights Reserved